package com.chenjun.designpattern.behavior.mediator;

/**
 * Mediator（媒介模式）定义： 用一个中介对象来封装一系列关于对象交互行为 问题：为何使用mediator ？
 * 各个对象之间的交互操作非常多，每个对象行为操作都彼此依赖对方 修改一个对象的行为，会同时涉及到修改其他对象的行为，如果使用Mediator模式
 * 可以使得各个对象间的耦合松散，只需关心和Mediator的关系 使得"多对多"的关系(可以理解成QQ好友的网状关系)可以降为
 * “一对多”（可以理解成QQ群）的关系 降低系统复杂性，提高可修改的扩展性
 * 
 * @author admin
 *
 */
public class 中介者模式
{
	public static void main(String[] args)
	{
		AbstractColleague collA = new ColleagueA();
		collA.setNumber(1000);
		
		AbstractColleague collB = new ColleagueB();
		collB.setNumber(1000);
		
		AbstractMediator am = new Mediator(collA, collB);

		System.out.println("==========通过设置A影响B==========");
		collA.changeNumber(1000, am);  
        System.out.println("collA的number值为："+collA.getNumber());  
        System.out.println("collB的number值为A的10倍："+collB.getNumber());
        
        System.out.println("==========通过设置B影响A=========="); 
        collB.changeNumber(1000, am);  
        System.out.println("collB的number值为："+collB.getNumber());  
        System.out.println("collA的number值为B的0.1倍："+collA.getNumber());
	}
}

abstract class AbstractColleague
{
	protected int number;

	public int getNumber()
	{
		return number;
	}

	public void setNumber(int number)
	{
		this.number = number;
	}

	public abstract void changeNumber(int number, AbstractMediator am);
}

class ColleagueA extends AbstractColleague
{
	@Override
	public void changeNumber(int number, AbstractMediator am)
	{
		this.number = number;
		am.AaffectB(); //核心在这里
	}
}

class ColleagueB extends AbstractColleague
{

	@Override
	public void changeNumber(int number, AbstractMediator am)
	{
		this.number = number;
		am.BaffectA();  //核心在这里
	}
}

abstract class AbstractMediator
{
	protected AbstractColleague a;
	protected AbstractColleague b;

	public AbstractMediator(AbstractColleague a, AbstractColleague b)
	{
		this.a = a;
		this.b = b;
	}

	public abstract void AaffectB();

	public abstract void BaffectA();
}

class Mediator extends AbstractMediator
{
	public Mediator(AbstractColleague a, AbstractColleague b)
	{
		super(a, b);
	}

	@Override
	public void AaffectB()
	{
		int number = a.getNumber();
		b.setNumber(number*10);
	}

	@Override
	public void BaffectA()
	{
		int number = b.getNumber();
		a.setNumber(number/10);
	}
}
